Skip to main content

用 GitHub Actions 自动打包发布 Python 项目

原文链接

文章目录​

  1. 前言
  2. 在 GitHub 上保存 token
  3. 创建 workflow
  4. 定义工作流程的工作环境
  5. 签出项目,构建发行版
  6. 发布到 PyPI 和 TestPyPI
  7. 完事,收工!

前言​

还在手动打包上传 PyPI?GitHub Actions 自动化真香!🌟

在《Python 代码一键转流程图》一文中,我介绍了我的开源项目 PyFlowchart。这段时间,已有好几位朋友为这个项目提出建议或报告 Bug,在他们的帮助下,项目已更新了多个版本。

然而,每次版本更新时,我都需要做很多冗余的工作:

  • 在 GitHub 上发布一个 release
  • 手动打包并上传到 PyPI

这些步骤十分繁琐,特别是上传 PyPI 的工作非常模板化。于是,我决定用 GitHub Actions 自动化这个过程,让发布新版本时,只需在 GitHub 上创建一个 Release,GitHub Actions 会自动完成构建、打包、上传到 PyPI 的所有工作。

本文将介绍如何利用 GitHub Actions 自动化发布 Python 包到 PyPI。


在 GitHub 上保存 token​

在本文中,我们需要上传项目到 PyPI 和 TestPyPI。为此,我们需要创建两个 API token,并将它们保存到 GitHub 仓库的 Secrets 中。

1. 创建 PyPI Token​

访问 PyPI API token 页面,创建一个新的 API token。确保将 token 的作用域限制为只能操作当前项目。

生成 token 后,记得保存。该页面会只显示一次 token。

2. 创建 TestPyPI Token​

访问 TestPyPI API token 页面,重复步骤,创建 TestPyPI 的 token。

注意:如果你还没有 TestPyPI 账号,需要先注册一个。TestPyPI 和 PyPI 的账号是独立的。

3. 将 Token 保存到 GitHub Secrets​

在 GitHub 项目页面,点击 Settings > Secrets,创建两个新的 secrets:

  • PYPI_API_TOKEN:用于上传到 PyPI
  • TEST_PYPI_API_TOKEN:用于上传到 TestPyPI

创建 workflow​

GitHub CI/CD 工作流程(workflow)是存储在 .github/workflows/ 目录下的 YAML 文件。

我们将创建一个名为 publish-to-test-pypi.yml 的文件。

name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI

on: push

这里定义了工作流程的名称,以及当 push 事件发生时触发工作流程。


定义工作流程的工作环境​

接下来,我们为工作(job)设置初始环境。此环境将在 Ubuntu 18.04 上执行任务。

jobs:
build-n-publish:
name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
runs-on: ubuntu-18.04

签出项目,构建发行版​

在 build-n-publish 部分下添加以下步骤:

steps:
- uses: actions/checkout@master
- name: Set up Python 3.7
uses: actions/setup-python@v1
with:
python-version: 3.7

这将把项目代码下载到 CI 运行容器中,并安装 Python 3.7 环境。

构建发行版​

在此示例中,我们将使用 build 包来构建发行版,确保项目中已正确设置 pyproject.toml(参见 PEP 517 / PEP 518)。

- name: Install pypa/build
run: python -m pip install build --user
- name: Build a binary wheel and a source tarball
run: python -m build --sdist --wheel --outdir dist/ .

这些步骤将使用 build 工具生成 .tar.gz 和 .whl 格式的发行版,并保存到 dist/ 文件夹。


发布到 PyPI 和 TestPyPI​

最后,添加发布步骤:

- name: Publish distribution 📦 to Test PyPI
uses: pypa/gh-action-pypi-publish@master
with:
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
repository_url: https://test.pypi.org/legacy/

- name: Publish distribution 📦 to PyPI
if: startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@master
with:
password: ${{ secrets.PYPI_API_TOKEN }}
  • 第一个步骤将无条件上传 dist/ 文件夹中的内容到 TestPyPI。
  • 第二个步骤会在 git tag 的提交上执行,将内容上传到 PyPI。

完事,收工!​

现在,每当你将打上标签(tag)的提交推送到 GitHub 时,这个工作流程将会自动发布到 PyPI。对于任何 push 操作,都会将代码打包并上传到 TestPyPI,这对于提供 alpha 测试版本和确保发布渠道的健康非常有用!


版权声明​

本文为CSDN博主「CDFMLR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u012419550/article/details/112746782


这篇文章已经经过重新排版,删除了一些冗余部分,并且结构更加清晰易读。希望这对你有帮助!